iT邦幫忙

2026 iThome 鐵人賽

DAY 18
1
Security

《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》系列 第 18 篇

Day 18 — AD 常見攻擊手法:需要什麼條件、利用什麼機制、能拿到什麼

  • 分享至 

  • xImage
  •  

雖然昨天有了「Kerberos 員工日遊樂園版」,對 Kerberos 的機制跟相關攻擊比較有概念了,

但……AD 的常見攻擊可不只 Kerberoasting、Golden Ticket、AS-REP Roasting 這幾個!

今天就來整理一下 AD 常見攻擊的機制跟特徵,跟大家一起把它們搞清楚一點 xddd

這次整理的重點不是「怎麼打」,而是先看懂每個手法成立的條件!!!

知道每個攻擊的成立背景,我們才能更有效率地判斷下一步該往哪個方向走~

畢竟滲透測試是有時間壓力的,
方向走錯,可是會少掉很多寶貴的時間 QQ

當然,在 Information Gathering 階段,能多了解目標環境、多收集一些線索,還是很重要的~

那我們就快來一起認識這些 AD 常見的攻擊手法吧!


不能偏心~~~ AD 可是有兩套常見的認證機制!(不只 Kerberos)

Day 17 我們詳細看過 Kerberos 的機制。

但在 AD 裡,其實還有另一個很常見的認證機制——NTLM。

而且我們今天要看的AD常見攻擊手法,剛好兩邊都有份 xddd

所以在正式看 AD 常見攻擊前,我們先快速來一起看看這兩個驗證機制~

Kerberos NTLM
驗證方式 透過票證進行驗證 挑戰/回應(Challenge-Response)
雙向驗證 ✅ 有 ❌ 沒有
主要攻擊 AS-REP Roasting、Kerberoasting、Golden Ticket Pass-the-Hash、LLMNR/NBT-NS Poisoning
現在還用嗎? ✅ AD 預設優先使用 ⚠️ 還在使用,但 Microsoft 持續推動降低 NTLM 的使用

什麼? 還有NTLM?

因為有些老舊系統、應用程式或特定情境不支援 Kerberos,這時候就可能還是使用 NTLM QQ

所以雖然 Kerberos 是 AD 環境中的主要認證機制,NTLM 並沒有直接消失><

所以考量AD攻擊時,NTLM 相關的攻擊面也要一起注意!


進入今天的重點!!! 來看看這些 AD 常見攻擊手法的成立條件與利用機制

進入今天的重點!!! 先來拆解這五招

手法 拆開面具…
Kerberoasting 「我找到一個有 SPN 的服務帳號,跟系統要它的服務票,再拿這張票回家慢慢猜服務帳號的密碼。」
AS-REP Roasting 「這個帳號關掉了預先驗證,我不用知道它的密碼,就可以拿到一包資料回家慢慢猜密碼。」
Pass-the-Hash 「我不用知道你的密碼,我手上有你的 NTLM Hash,在支援 NTLM 的情況下,就可能直接拿這個 Hash 做身分驗證。」
LLMNR/NBT-NS Poisoning 「有人大聲問『欸誰是 FILE01?』,我搶著舉手喊『我我我!』,讓對方把 NTLM 認證資料送到我這裡。」
DCSync 「我有了足夠的 AD 複寫權限,就可以跟 DC 要求複寫資料,進一步取得其他帳號的認證資料。」
手法 前置條件 利用什麼機制 能取得什麼 怎麼辨別有機會攻擊
Kerberoasting 任一可以通過驗證的網域帳號 找到註冊 SPN 的使用者服務帳號 → 請求 Service Ticket 可離線破解的 TGS 資料(如 $krb5tgs$),進一步嘗試取得服務帳號密碼 找到使用者帳號註冊 SPN
AS-REP Roasting 只要知道帳號名稱,不需要密碼 帳號設定 DONT_REQUIRE_PREAUTH → KDC 不要求 Pre-authentication 就回傳 AS-REP 可離線破解的 AS-REP 資料(如 $krb5asrep$),進一步嘗試取得帳號密碼 檢查 userAccountControl 是否有對應旗標
Pass-the-Hash 已取得某帳號的 NTLM Hash 利用 NTLM 的 Challenge-Response 機制,使用 Hash 進行驗證 可以該帳號身分嘗試存取其他主機或服務 手上有 NTLM Hash,且目標服務使用 NTLM
LLMNR/NBT-NS Poisoning 通常需要跟受害者在同網段 名稱解析失敗退回廣播查詢時,攻擊者搶先偽造回應,誘使受害者將認證送到攻擊者 受害者送出的 Net-NTLMv2 認證資料 同網段,且環境存在 LLMNR/NBT-NS 名稱解析
DCSync 帳號具有適當的 AD 複寫權限(DS-Replication-Get-Changes + Get-Changes-All) 利用 AD Replication 機制向 DC 要求複寫資料 其他帳號的認證資料,權限足夠時可包含 krbtgt 檢查目前帳號是否具有相關複寫權限

那些我差點搞混的東西:

1. Kerberoasting vs AS-REP Roasting
兩個都利用 Kerberos,但切入點不同:

  • AS-REP Roasting 不需要密碼,針對關掉預先驗證的帳號
  • Kerberoasting 需要先有一個可以通過驗證的網域帳號,再去找有 SPN 的服務帳號

2. Pass-the-Hash 跟 Kerberos 沒關係
PtH 用的是 NTLM 協定,不是 Kerberos。在特定支援 NTLM 的驗證情境下,攻擊者取得 NTLM Hash 後,可以利用它進行身分驗證,而不需要知道原始密碼。

Pass-the-Hash 的核心前提:目標認證流程必須使用 NTLM(如果走的是 Kerberos,就不是一般 PtH 的使用情境)

3. LLMNR Poisoning 是「守株待兔」
不是主動打進去,而是等——等別人的電腦找不到主機名稱,廣播出來問「有沒有人知道這台在哪」,攻擊者假裝自己是那台機器回應,拿到對方送來的 NTLM hash。


這些攻擊落滲透測試「八個階段」的哪兒

還記得 Day 2 整理的滲透測試八階段嗎?

https://ithelp.ithome.com.tw/upload/images/20261002/20184189328JM7NFXq.png

我們來把這幾個 AD 常見的攻擊/技術對應起來,
這樣之後就比較知道什麼時候該派誰上場 xddd

攻擊/技術 主要落在哪個階段 為什麼
SPN 列舉(GetUserSPNs 不加 -request) ② Information Gathering 先把機器的樣子拼出來:哪些帳號有 SPN、有哪些服務帳號值得進一步看
AS-REP Roasting ③ → ④ 先找出沒有要求 Kerberos Pre-authentication 的帳號,再取得可離線破解的資料
Kerberoasting ③ → ④ 先找出有 SPN 的使用者帳號,再取得 Service Ticket 進行後續分析
Pass-the-Hash ⑥ Lateral Movement 已經取得帳號的 NTLM Hash 後,拿來嘗試存取其他主機
DCSync ⑤ Post-Exploitation 取得足夠的 AD 權限後,利用原本給 DC 之間使用的「AD 複寫機制」,向 DC 要求複寫資料,進一步取得其他帳號的認證資料。

我們今天的實作目標 - 用 GetUserSPNs.py 列出有 SPN 的帳號

呼應 Day 2~
滲透測試不是把每個階段各做一次就結束,
而是會根據新取得的資訊,不斷回頭重新判斷下一步。

例如:
列舉(②)發現 svc-alfresco 關了 pre-auth
→ AS-REP Roasting(④) 拿到 hash → 破出密碼登入
→ 回頭再列舉(②) → 找 SPN、找提權路徑
哇!!!我們真的開始把前面學的東西串起來了~~~


開始實作囉~~~

這是今天在Forest機器拿到的target ip 10.129.76.247

https://ithelp.ithome.com.tw/upload/images/20261002/20184189YOqucftUtW.png

本日目標:用 GetUserSPNs.py 列出有 SPN 的帳號


實作前 再來一起看一下!!!

GetUserSPNs.py 是什麼?

還記得Day 15我們有用 GetNPUsers.py,取得不需要預先驗證的帳號,今天要用 GetUserSPNs.py,大家有沒有覺得他們長得有點像><因為......他們都是impacket工具包裡的工具

工具 攻擊手法 目標帳號 需要帳密? 拿到什麼 怎麼利用
GetNPUsers.py AS-REP Roasting 關掉預先驗證的帳號 不需要 $krb5asrep$23$ 格式的 hash 丟 hashcat -m 18200 離線爆破 → 猜中就拿到該帳號明文密碼,等於多一組可登入帳密
GetUserSPNs.py Kerberoasting 有 SPN 的服務帳號 需要 $krb5tgs$23$ 格式的 hash 丟 hashcat -m 13100 離線爆破 → 猜中就拿到服務帳號明文密碼,而使用者的服務帳號常有高權限,可能直接提權

Day 17 不是已經用 setspn.exe 跟 PowerView 找過 SPN 了嗎?為什麼還要從目標機外再找一次?

這三個工具做的事情有點像,但使用情境不太一樣,來一起把它們分清楚~~~

關鍵差別不是功能,而是——我們現在是在網域環境裡查,還是從 Kali 查!

setspn 和 PowerView 通常是在 Windows shell/網域環境中使用;
GetUserSPNs.py 則可以人在 Kali,只靠一組有效網域帳密從外部查詢 AD。

工具 在哪裡跑 找什麼 用的時機
setspn.exe Windows shell 裡 所有註冊 SPN 的 AD 物件(含機器帳號,要自己再判斷) 已經在 shell 裡,想快速查看 SPN
Get-DomainUser -SPN Windows shell 裡(需要 PowerView) 使用者帳號的 SPN 想從使用者帳號角度查看 SPN
GetUserSPNs.py Kali 上 直接找較符合 Kerberoasting 條件的使用者帳號 還沒進 shell、只有有效網域帳密時,從外部進行列舉

setspn -Q */* 查到的 SPN 會包含機器帳號,
但機器帳號通常使用系統管理的長隨機密碼,因此一般不是 Kerberoasting 優先考慮的目標。

Kerberoasting 通常會優先關注註冊 SPN 的使用者服務帳號。
所以用 setspn 查完之後,還需要自己判斷哪些帳號值得進一步看~
GetUserSPNs.py 則會幫我們把結果篩成更接近 Kerberoasting 目標的使用者帳號!


為什麼還要從目標機外再找一次?

不是每次拿到帳密都能直接進 shell。

有可能:

  • 帳號沒有 WinRM 權限
  • 5985 沒有開
  • 或目前的帳號權限不足以登入目標主機

這些情境的共通點是——我們有「網域層級」的身份,但沒有「某台主機」的登入權。

而 Kerberoasting 的前置條件之一,是有一組可以通過網域驗證的帳號
不需要先取得目標服務帳號的密碼,也不需要先登入某台主機。

這也是為什麼 Kerberoasting 的切入點,可以比「先取得某台主機的 shell」更早~

這時候,即使還沒有 shell,只要手上有一組有效的網域帳密,就可以先從外部做 AD Enumeration><


** 等等Day 17 的 Get-DomainUser -SPN 有找到 krbtgt,但 GetUserSPNs.py 顯示 No entries found!???為什麼???**

GetUserSPNs.py 的查詢會排除停用帳號、電腦帳號等條件,所以像 krbtgt 這種停用帳號,通常就不會被列出來~

GetUserSPNs.py的查詢條件會把停用帳號、電腦帳號等排除,留下可用的使用者帳號!
krbtgt 預設是停用狀態,所以通常不會出現在結果裡~

兩個結果看起來不一樣,但結論一樣:Forest 沒有真正適合 Kerberoasting 的目標。


為什麼還需要從目標機器列舉?GetUserSPNs.py 不就夠了嗎?

不知道大家有沒有跟我一樣,看到這裡腦袋先浮出一個問題 xddd

「都已經有 GetUserSPNs.py 可以找 Kerberoasting 目標了,為什麼還要從目標機器列舉 SPN?」

查了一下資料的我 xddd,才發現——

這幾個工具雖然都可以看到 SPN,但目的不太一樣。

  • GetUserSPNs.py:專門用來列舉具有 SPN 的使用者帳號,方便快速找出可能的 Kerberoasting 目標。
  • Get-DomainUser -SPN / setspn.exe:比較偏向 AD 列舉,讓你從網域內部了解「有哪些帳號設定了 SPN、這些 SPN 對應什麼服務」。

所以進到 shell 之後,再列舉一次 SPN,不只是為了找 Kerberoasting 目標。

你是在多了解一點整個 AD 環境:

哪些帳號有 SPN?
哪些服務正在使用?
有沒有奇怪或不合理的設定?

這些資訊之後也可能拿來搭配 BloodHound 做分析,幫助我們理解整個環境裡的關係,以及可能的攻擊路徑。

簡單記:

GetUserSPNs.py
    ↓
比較偏向「找 Kerberoasting 目標」

setspn.exe / Get-DomainUser -SPN
    ↓
比較偏向「了解 AD 裡的 SPN 設定」

所以不是 GetUserSPNs.py 不夠,而是——
你站的位置不同,想回答的問題也不同。


Get-DomainUser -SPN 只有攻擊者在用嗎?

其實不是!!!

管理員跟攻擊者都可能使用這類工具,只是目的完全不同。同一份 SPN 清單,兩種人看出來的東西天差地遠><

👨‍💻 管理員 🕵️ 攻擊者
目的 稽核、確認設定正確 偵察、找攻擊目標
會做什麼 查哪些帳號有 SPN、找出不再使用的 SPN、檢查服務帳號設定 了解 AD 環境、找出有 SPN 的帳號、鎖定 Kerberoasting 目標
同一個問題 「這些 SPN 設定得對不對?」 「這些 SPN 哪個可以打?」

其實就很像 nmap~
管理員可以拿來掃自己的網路,了解有哪些服務!攻擊者也可以拿來偵察目標~

這也是我覺得學 AD 滲透很有趣的地方 xddd

很多東西不是「攻擊者專用工具」,而是原本就存在於 Windows / AD 管理環境中的功能,只是到了不同情境,使用方式跟目的就不一樣了!!!


這次真的要實作惹~~~

在 Kali 上跑,用Day 15爆破得到的帳密:

GetUserSPNs.py htb.local/svc-alfresco:s3rvice -dc-ip 10.129.76.247
指令 用途
GetUserSPNs.py 我們的工具!我們請他幫我們找「有 SPN 的帳號」
htb.local/ 網域名稱,跟我們的工具說「我要查 htb.local 這個網域」
svc-alfresco 我登入用的帳號(冒號前面)
s3rvice 這個帳號的密碼(冒號後面)
-dc-ip 10.129.76.247 DC 的 IP,要跟它要資料嘛,總得知道它在哪

https://ithelp.ithome.com.tw/upload/images/20261002/20184189JQwmyMvcnG.png

沒有 QQ

跟 Day 17 setspn.exe 跟 Get-DomainUser -SPN 的結論完全一樣——三個工具、兩天操作,都確認了同一件事:Forest 沒有適合 Kerberoasting 的目標。

svc-alfresco 沒有 SPN,其他的不是機器帳號就是 krbtgt,密碼都不好破解,所以這次沒有適合拿來做 Kerberoasting 的服務帳號QQ

所以這次 Forest 的攻擊路徑不走 Kerberoasting

今天讀 Kerberoasting 是學觀念——在其他 AD 環境如果遇到符合條件的服務帳號,到時候就用得上了 xdd


本日回顧

本來面對這麼多名詞,整個霧颯颯 😵,但經過昨天先搞懂認證的原理、加上實作,今天再回來做比較,終於比較了解了,好感動!

尤其今天能把這麼多複雜的機制一個個拆解、想通它的原理、想清楚「我們到底想達成什麼目的」,這種感覺真的很好~ 我想這對之後要真正動手使用的時候,會很有幫助!

回頭看發現:

先懂「認證的運作機制」,再思考「攻擊怎麼成立」,真的比較不卡了!!!

耶~~~

明天是我們 AD 部分的最後一天——我們一起用 BloodHound 把整個攻擊路徑視覺化 👀


上一篇
Day 17 —Kerberos 認證:TGT 跟 Service Ticket 到底差在哪
下一篇
Day 19 — BloodHound:原來 svc-alfresco 可以走到這裡!
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言